iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 18

30 天了解 Swift 的 Combine: [18] Custom Publisher for UIKit

  • 分享至 

  • xImage
  •  

首先先看看這個 extension

extension UITextField {
    var textPublisher: AnyPublisher<String?, Never> {
        NotificationCenter.default // 1
            .publisher(for: UITextField.textDidChangeNotification, object: self)
            .compactMap { $0.object as? UITextField } // 2
            .filter { $0 == self } // 3
            .map { $0.text}
            .eraseToAnyPublisher()
    }
}
  1. 我們建立一個來自 NotificationCenter的 Publisher
  2. 從通知提取 Object 並轉型
  3. 確認發佈來源

透過這樣的方式, 我們可以創造 UITextField 的事件流!

import Combine


class ViewController: UIViewController {
    @IBOutlet  var aTextFileld: UITextField!
    @IBOutlet  var bTestField: UITextField!
    var set = Set<AnyCancellable>()
    
    let vc = UIViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        aTextFileld.textPublisher
            .assign(to: \UITextField.text, on: bTestField)
        .store(in: &set)
    }

}

如此, 就可以利用 UIKit 來理解 Combine 了

簡單測驗:

  1. 試試看套用所有的 UICotrol

參考來源: Multiple UITextFields and textDidChangeNotification notification
https://stackoverflow.com/a/56796398/10172299


上一篇
30 天了解 Swift 的 Combine: [17] 進入 UIKit 之前, 介紹 @Published
下一篇
30 天了解 Swift 的 Combine: [19] 使用 @Published 改寫 Day 18
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
陳董粉絲
iT邦新手 5 級 ‧ 2019-10-17 12:20:25

好奇問一下 Combine現在還沒有類似Rxcocoa的東西嗎

ytyubox iT邦新手 5 級 ‧ 2019-10-17 17:02:33 檢舉

我對 RxCocoa 不熟,要類似什麼呢?

就是做你上面做的事 一整包對UI的extension

ytyubox iT邦新手 5 級 ‧ 2019-10-17 18:27:07 檢舉

目前 Apple 主要在 SwiftUI 有建立,未來不確定喔

我要留言

立即登入留言